package cn.fu.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * @Target ：作用域，方法和类上
 * 
 *   (CONSTRUCTION:构造方法声明  FIELD:字段声明
 *   LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 
 *   PACKAGE:包声明 PARAMETER:参数声明 TYPE:类声明)
 *   
 * @Retention 作用域:运行时
 * 
 * 	(SOURCE:只在源码显示,编译时会丢弃  
 *   CLASS:编译时会记录到CLASS中，运行时忽略
 *   RUNTIME:运行时存在，可以通过反射读取)
 *   
 * @Inherited
 * (允许子类继承)
 * 
 * @Documented
 * (生成javadoc时会包含注解,本注解为标识注解)
 * 
 * 语法要求：***** 
 * 1.使用@interface关健字定义注解
 * 2.成员以无参无异常方式声明
 * 3.可以使用default为成员指定一个默认值
 * 
 * 4.成员类型是受限的，合法的类型包括原始类型
 * 及String,Class,Annotation,Enumeration
 * 
 * 5.如果注解只有一个成员，则成员名必须取名为value()，
 * 在使用时可以忽略成员名和赋值号(=)
 * 
 * 6.注解类可以没有成员，没有成员的注解为标识注解
 * 
 * @Inherited 继承父类的注解，接口的注解是无效的，只会继承类上的注解，而不会继承方法上的注解
 * @author 99fu
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
	//语法错误：不可抛异常
//	String name() throws Exception;
	//语法错误：不可有参数
//	String name(String str);
	//语法错误：错误的成员类型
//	Map name();
	
	String name();
	String gender();
	int age() default 30;

}
;